home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.6 / subsample / convolve1r.c next >
C/C++ Source or Header  |  1999-09-11  |  3KB  |  76 lines

  1. /* 
  2.  * convolve1r.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /* CONVOLVE1R:  function performs 2-D convolution by separable, 
  10.  *            symmetric, 1-D filter mask, then outputs subsample image 
  11.  *                  usage: convolve1r (imgI, imgO, fltr1D, nFltr)
  12.  */
  13.  
  14. #include <images.h>
  15. #include <tiffimage.h>
  16.  
  17. void
  18. convolve1r (imgI, imgO, fltr1D, nFltr, rSubsample)
  19.      Image *imgI;               /* input image structure */
  20.      Image *imgO;               /* output image structure */
  21.      long *fltr1D;              /* 1-D of filter mask */
  22.      long nFltr;                /* number of filter coefficients */
  23.      long rSubsample;           /* subsample rate */
  24. {
  25.   Image *imgT;                  /* intermediate image structure */
  26.   unsigned char **imgIn,        /* input image */
  27.   **imgTi,                      /* intermediate image */
  28.   **imgOut;                     /* output image */
  29.   long width, height;           /* size of image */
  30.   long sumFltr;                 /* sum of fltr coefficients */
  31.   long sum;                     /* sum of filter convolution at a pixel */
  32.   long midFltr;                 /* middle coefficient index of filter */
  33.   long xEnd, yEnd;              /* end coefficients of convolution */
  34.   long xOut, yOut;              /* output image coordinates */
  35.   long x, y, i;
  36.  
  37. /* initialize images */
  38.   imgIn = ImageGetPtr (imgI);
  39.   height = ImageGetHeight (imgI);
  40.   width = ImageGetWidth (imgI);
  41.   imgT = ImageAlloc (height, width, 8);
  42.   imgTi = ImageGetPtr (imgT);
  43.   imgOut = ImageGetPtr (imgO);
  44.  
  45. /* find sum of filter coefficients */
  46.   for (i = 0, sumFltr = 0; i < nFltr; i++)
  47.     sumFltr += fltr1D[i];
  48.  
  49. /* perform row-wise convolution */
  50.   midFltr = (nFltr - 1) / 2;
  51.   xEnd = width - midFltr;
  52.   for (y = 0; y < height; y++) {
  53.     for (x = midFltr; x < xEnd; x += rSubsample) {
  54.       sum = fltr1D[midFltr] * imgIn[y][x];
  55.       for (i = 1; i <= midFltr; i++)
  56.         sum += fltr1D[i + midFltr]
  57.           * (imgIn[y][x - i] + imgIn[y][x + i]);
  58.       imgTi[y][x] = (unsigned char) (sum / sumFltr);
  59.     }
  60.   }
  61.  
  62. /* perform column-wise convolution */
  63.   yEnd = height - midFltr;
  64.   for (y = midFltr, yOut = 0; y < yEnd; y += rSubsample) {
  65.     for (x = midFltr, xOut = 0; x < xEnd; x += rSubsample) {
  66.       sum = fltr1D[midFltr] * imgTi[y][x];
  67.       for (i = 1; i <= midFltr; i++)
  68.         sum += fltr1D[i + midFltr] * (imgTi[y - i][x] + imgTi[y + i][x]);
  69.       imgOut[yOut][xOut++] = (unsigned char) (sum / sumFltr);
  70.     }
  71.     yOut++;
  72.   }
  73.  
  74.   return;
  75. }
  76.